package com.wlc.io;

import com.sun.org.apache.bcel.internal.generic.IFLE;

import java.io.*;
import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description 测试拆分大文件
 * @date 2021-07-09 10:21
 */
public class StreamDemo {


    /**
     * 合并大文件
     */
    public static void mergeFile() {
        try {
            // 目标文件
            File file = new File("/Users/wanglichao/Desktop/temp/test.txt");
            int index = 0;
            // 写如到目标文件内
            FileOutputStream fileOutputStream = new FileOutputStream(file);

            while (true) {
                // 子文件
                File childFile = new File("/Users/wanglichao/Desktop/temp/", "jmeter.log-" + index++);
                // 如果子文件不存在，就退出
                if (!childFile.exists()) {
                    break;
                }
                // 读取子文件

                FileInputStream fileInputStream = new FileInputStream(childFile);
                // 定义字节
                byte[] data = new byte[(int) childFile.length()];
                fileInputStream.read(data);
                fileInputStream.close();

                // 写出到目标文件中
                fileOutputStream.write(data);
                fileOutputStream.flush();
                System.out.println("文件写入完毕。");
            }


            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 拆分大文件
     * 拆分思路：  先把源文件读取到内存中，然后从内存中把文件依次拆分
     */
    public static void splitFile(File file, int eachSize) {
        // 读取源文件
        // 如果文件的长度等于0，表示不可以拆分
        if (0 == file.length()) {
            throw new RuntimeException("文件大小为0kb，不可以拆分!");
        }
        // 定义字节数组，长度就是文件的长度
        // 总文件
        byte[] fileContent = new byte[(int) file.length()];
        try {
            // 定义文件输入流，用于读取文件
            FileInputStream fileInputStream = new FileInputStream(file);
            // 使用文件输入流读取文件到内存中
            fileInputStream.read(fileContent);
            // 关闭输入流
            fileInputStream.close();

        } catch (IOException e) {
            System.out.println("发生错误的原因：" + e.getMessage());
        }
        // 计算可以被拆分成多少份
        int fileNumber = 0;
        if (0 == fileContent.length % eachSize) {
            fileNumber = (int) (file.length() / eachSize);
        } else {
            fileNumber = (int) (file.length() / eachSize) + 1;
        }

        // 从总文件内容中为每一个文件赋值
        for (int i = 0; i < fileNumber; i++) {
            // 每一份文件的名称
            String eachFileName = file.getName() + "-" + i;
            File eachFile = new File(file.getParent(), eachFileName);
            byte[] eachContent;

            // 判断是不是最后一个文件，如果不是最后一个文件，则内容是100kb; 如果是最后一个，内容为总文件中剩余的；
            if (i != fileNumber - 1) {
                // 不是最后一个
                eachContent = Arrays.copyOfRange(fileContent, eachSize * i, eachSize * (i + 1));
            } else {
                // 是最后一个
                eachContent = Arrays.copyOfRange(fileContent, eachSize * i, fileContent.length);
            }

            // 把文件写出去
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(eachFile);
                fileOutputStream.write(eachContent);
                fileOutputStream.close();
                System.out.printf("输出文件结束，文件名称%s,文件大小%d%n", eachFile.getAbsoluteFile(), eachFile.length());
            } catch (IOException e) {
                System.out.println("读取数据发生异常，原因： " + e.getMessage());
            }
        }


    }

    /**
     * 使用try() 来关闭流。在try,catch,finally 执行结束的时候，自动关闭流，回收相应的资源
     */
    public void testClose() {
        File file = new File("/Users/wanglichao/Desktop/temp/test.txt");
        try (FileInputStream fileInputStream = new FileInputStream(file)) {
            byte[] bytes = new byte[(int) file.length()];
            fileInputStream.read(bytes);
            for (byte aByte : bytes) {
                System.out.println("结果为： " + aByte);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 合并大文件  使用try() 来进行回收资源
     */
    public static void mergeFile2() {
        File file = new File("/Users/wanglichao/Desktop/temp/test.txt");
        try(FileOutputStream fileOutputStream = new FileOutputStream(file)) {
            // 目标文件
            int index = 0;
            // 写如到目标文件内
            while (true) {
                // 子文件
                File childFile = new File("/Users/wanglichao/Desktop/temp/", "jmeter.log-" + index++);
                // 如果子文件不存在，就退出
                if (!childFile.exists()) {
                    break;
                }
                // 读取子文件
                try(FileInputStream fileInputStream = new FileInputStream(childFile);){

                    // 定义字节
                    byte[] data = new byte[(int) childFile.length()];
                    fileInputStream.read(data);
                    fileInputStream.close();

                    // 写出到目标文件中
                    fileOutputStream.write(data);
                    fileOutputStream.flush();
                }
                System.out.println("文件写入完毕。");
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static void main(String[] args) {
        // 每一个文件的大小
        int eachSize = 100 * 1024;
        // 定义一个文件
        File file = new File("/Users/wanglichao/Desktop/temp/jmeter.log");
        // splitFile(file, eachSize);
        // mergeFile();
        new StreamDemo().testClose();

    }
}
